package com.hoan.bitmap;

import android.graphics.Bitmap;
import android.os.Environment;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;

/**
 * @author chenqiang
 * @date 2022/7/28
 */
public class FileUtils {
    private static final class FileUtilsHolder {
        static final FileUtils fileUtils = new FileUtils();
    }

    public static FileUtils getInstance() {
        return FileUtilsHolder.fileUtils;
    }

    //保存图片文件
    public static String saveToFile(Bitmap croppedImage, boolean isDir, int reqSize) {
        try {
            File jpgFile;
            if (isDir) {
                File fileFolder = new File(getPhotoPath());
                Date date = new Date();
                SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 格式化时间
//            String filename = format.format(date) + ".png";
                String filename = format.format(date) + ".jpg";
                if (!fileFolder.exists()) { // 如果目录不存在，则创建一个名为"finger"的目录
                    getInstance().mkdir(fileFolder);
                }
                jpgFile = new File(fileFolder, filename);
            } else {
                jpgFile = new File(getPhotoPath());
                if (!jpgFile.getParentFile().exists()) { // 如果目录不存在，则创建一个名为"finger"的目录
                    getInstance().mkdir(jpgFile.getParentFile());
                }
            }

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            //quality 为0～100，0表示最小体积，100表示最高质量，对应体积也是最大
            //质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中
            croppedImage.compress(Bitmap.CompressFormat.JPEG, 100, baos);

            int options = 80;//先压缩到80%
            while (baos.toByteArray().length / 1024 > reqSize) { // 循环判断如果压缩后图片是否大于200kb,大于继续压缩
                if (options <= 0) {//有的图片过大，可能当options小于或者等于0时，它的大小还是大于目标大小，于是就会发生异常，异常的原因是options超过规定值。所以此处需要判断一下
                    break;
                }
                baos.reset();// 重置baos即清空baos
                options -= 5;// 每次都减少10
                croppedImage.compress(Bitmap.CompressFormat.JPEG, options, baos);
            }

            FileOutputStream fos = new FileOutputStream(jpgFile);
            fos.write(baos.toByteArray());
            fos.close();
            baos.close();
            return jpgFile.getPath();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "";
    }


    //质量压缩并存到SD卡中
    public static String qualityCompress(Bitmap bitmap, int reqSize) {
        try {
            File fileFolder = new File(getPhotoPath());
            Date date = new Date();
            SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 格式化时间
//            String filename = format.format(date) + ".png";
            String filename = format.format(date) + ".jpg";
            if (!fileFolder.exists()) { // 如果目录不存在，则创建一个名为"finger"的目录
                getInstance().mkdir(fileFolder);
            }
            File jpgFile = new File(fileFolder, filename);


            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            //quality 为0～100，0表示最小体积，100表示最高质量，对应体积也是最大
            //质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);

            int options = 80;
            //如果压缩后的大小超出所要求的，继续压缩
            while (baos.toByteArray().length / 1024 > reqSize) {
                baos.reset();
                bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
                //每次减少5%质量
                if (options > 5) {//避免出现options<=0
                    options -= 5;
                } else {
                    break;
                }
            }

            FileOutputStream out = new FileOutputStream(jpgFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, options, out);
            baos.close();
            baos.close();
            return jpgFile.getPath();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "";
    }

    private boolean mkdir(File file) {
        while (!file.getParentFile().exists()) {
            mkdir(file.getParentFile());
        }
        return file.mkdir();
    }

    private static String getPhotoPath() {
        return Environment.getExternalStorageDirectory() + "/CoolShop/bitmapQuality/";
    }

}
